"""
演示python的闭包特性
"""


#简单闭包               inner函数既想要依赖一个外部参数,又不想要这个外部参数被改变
# def outer(loge):
#     def inner(msg):
#         print(f"<{loge}>{msg}<{loge}>")
#     return inner
#
# fn1 = outer("黑马程序员")
# fn1("学python")
# fn1("快快")
#
# fn2 = outer("传智教育")
# fn2("学python")
# fn2("快快")

#使用nonlocal关键字修改外部函数的值
# def outer(num1):
#     def inner(num2):
#         nonlocal num1
#         num1 +=num2
#         print(num1)
#     return inner
# fn1 = outer(10)
# fn1(10)
# fn1(10)
# fn1(10)
# fn1(10)

#使用闭包实现ATM小案例
def account_create(initial_amount=0):
    def atm(num,deposit=True):
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"存款 +{num},  账户余额:  {initial_amount}")
        else:
            initial_amount -= num
            print(f"取款 -{num},  账户余额:  {initial_amount}")
    return atm

atm = account_create()
atm(100)
atm(200)
atm(100,False)


"""
闭包:
    定义双层函数,内层函数可以访问外部变量
    将内存作为外层函数的返回,次内层函数就是闭包函数


优点:
    无需定义全局变量既可以实现通过函数,持续的访问,修改某个值
    闭包的变量存在于某个函数内部,难以被错误的调用修改
缺点:
    由于内部函数持续引用外部函数的值,所以导致这一部分内存一直不被释放,一直占用内存   
    
nonlocal关键字:
    内层函数要修改外层函数的值
"""



